home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / smallc11.arc / CC33.C < prev    next >
Text File  |  1988-06-27  |  5KB  |  225 lines

  1. #include <ctype.h>
  2. /*
  3. ** true if val1 -> int pointer or int array and val2 not ptr or array
  4. */
  5. dbltest(val1,val2) int val1[], val2[]; {
  6.   if(val1[2]!=CINT) return 0;
  7.   if(val2[2]) return 0;
  8.   return 1;
  9.   }
  10.  
  11. /*
  12. ** determine type of binary operation
  13. */
  14. result(lval, lval2) int lval[], lval2[]; {
  15.   if((lval[2]!=0)&(lval2[2]!=0)) {
  16.     lval[2]=0;
  17.     }
  18.   else if(lval2[2]) {
  19.     lval[0]=lval2[0];
  20.     lval[1]=lval2[1];
  21.     lval[2]=lval2[2];
  22.     }
  23.   }
  24.  
  25. step(oper, lval) int (*oper)(), lval[]; {
  26.   if(lval[1]) {
  27.     if(lval[5]) {
  28.       push();
  29.       rvalue(lval);
  30.       (*oper)(lval[2]>>2);
  31.       pop();
  32.       store(lval);
  33.       return;
  34.       }
  35.     else {
  36.       move();
  37.       lval[5]=1;
  38.       }
  39.     }
  40.   rvalue(lval);
  41.   (*oper)(lval[2]>>2);
  42.   store(lval);
  43.   }
  44.  
  45. store(lval)  int lval[]; {
  46.   if(lval[1]) putstk(lval);
  47.   else          putmem(lval);
  48.   }
  49.  
  50. rvalue(lval) int lval[]; {
  51.   if ((lval[0]!=0)&(lval[1]==0)) getmem(lval);
  52.   else                   indirect(lval);
  53.   }
  54.  
  55. test(label, parens)  int label, parens;  {
  56.   int lval[8];
  57.   int eq0(),ne0(),ult0(),le0(),lt0(),gt0(),ge0();
  58.   char *before, *start;
  59.  
  60.   if(parens) needtoken("(");
  61.   while(1) {
  62.     setstage(&before, &start);
  63.     if(heir1(lval)) rvalue(lval);
  64.     if(match(",")) clearstage(before, start);
  65.     else break;
  66.     }
  67.   if(parens) needtoken(")");
  68.   if(lval[3]) {  /* constant expression */
  69.     clearstage(before, 0);
  70.     if(lval[4]) return;
  71.     jump(label);
  72.     return;
  73.     }
  74.   if(lval[7]) {     /* stage address of "oper 0" code       */
  75.     oper=lval[6];    /* operator function address        */
  76.     if((oper == op[EQ])|(oper == op2[ULE]))
  77.              zerojump(eq0, label, lval);
  78.     else if((oper == op[NE])|(oper == op2[UGT]))
  79.              zerojump(ne0, label, lval);
  80.     else if (oper == op[GT] )  zerojump(gt0, label, lval);
  81.     else if (oper == op[GE] )  zerojump(ge0, label, lval);
  82.     else if (oper == op2[UGE]) clearstage(lval[7],0);
  83.     else if (oper == op[LT] )  zerojump(lt0, label, lval);
  84.     else if (oper == op2[ULT]) zerojump(ult0, label, lval);
  85.     else if (oper == op[LE] )  zerojump(le0, label, lval);
  86.     else         testjump(label);
  87.     }
  88.   else testjump(label);
  89.   clearstage(before, start);
  90.   }
  91.  
  92. constexpr(val) int *val; {
  93.   int const1;
  94.   char *before, *start;
  95.   setstage(&before, &start);
  96.   expression(&const1, val);
  97.   clearstage(before, 0);  /* scratch generated code */
  98.   if(const1==0) error("must be constant expression");
  99.   return const1;
  100.   }
  101.  
  102. const1(val) int val; {        /* this sucker generates        */
  103.   immed();            /* LDD #(val)                */
  104.   outdec(val);
  105.   nl();
  106.   }
  107.  
  108. const2(val) int val; {
  109.   immed2();
  110.   outdec(val);
  111.   nl();
  112.   }
  113.  
  114. constant(lval)    int lval[]; {
  115.   lval=lval+3;
  116.   *lval=1;     /* assume it will be a constant */
  117.   if (number(++lval)) immed();
  118.   else if (pstr(lval)) immed();
  119.   else if (qstr(lval)) {
  120.     *(lval-1)=0; /* nope, it's a string address */
  121.     immed();
  122.     printlabel(litlab);
  123.     outbyte('+');
  124.     }
  125.   else return 0;
  126.   outdec(*lval);
  127.   nl();
  128.   return 1;
  129.   }
  130.  
  131. number(val)  int val[]; {
  132.   int k, minus;
  133.   int hex;    /* -hm */
  134.   k=minus=0;
  135.   hex = 0;    /* -hm */
  136.  
  137.   while(1)
  138.   {
  139.     if(match("+"))    /* positive ?? */
  140.     ;
  141.     else if(match("-"))    /* negative ?? */
  142.     minus=1;
  143.     else if(match("0x")) /* -hm */
  144.     hex = 1;
  145.     else if(match("0X")) /* -hm */
  146.     hex = 1;
  147.     else
  148.     break;
  149.   }
  150.   if(hex)    /* -hm */
  151.   {
  152.     if(isxdigit(ch))
  153.     {
  154.         while(isxdigit(ch))
  155.         {
  156.             int tmp = inbyte();
  157.             if((tmp >= '0') && (tmp <= '9'))
  158.                 tmp = tmp - '0';
  159.             else if((tmp >= 'a') && (tmp <= 'f'))
  160.                 tmp = (tmp - 'a')+10;
  161.             else if((tmp >= 'A') && (tmp <= 'F'))
  162.                 tmp = (tmp - 'A')+10;
  163.             k=(k*16)+tmp;
  164.         }
  165.         val[0] = k;
  166.         return 1;
  167.     }
  168.   }
  169.   if(numeric(ch)==0)    /* char = numeric (0..9) ?? */
  170.     return 0;    /* no, exit */
  171.   while (numeric(ch))   /* yes, get input until not numeric */
  172.     k=k*10+(inbyte()-'0');
  173.   if (minus)
  174.     k=(-k);
  175.   val[0]=k;
  176.   return 1;
  177.   }
  178.  
  179. address(ptr) char *ptr; {
  180.   immed();
  181.   outstr(ptr+NAME);
  182.   nl();
  183.   }
  184.  
  185. pstr(val)  int val[]; {
  186.   int k;
  187.   k=0;
  188.   if (match("'")==0) return 0;
  189.   while(ch!=39)    k=(k&255)*256 + (litchar()&255);
  190.   ++lptr;
  191.   val[0]=k;
  192.   return 1;
  193.   }
  194.  
  195. qstr(val)  int val[]; {
  196.   char c;
  197.   if (match(quote)==0) return 0;
  198.   val[0]=litptr;
  199.   while (ch!='"') {
  200.     if(ch==0) break;
  201.     stowlit(litchar(), 1);
  202.     }
  203.   gch();
  204.   litq[litptr++]=0;
  205.   return 1;
  206.   }
  207.  
  208. /*
  209. ** return current literal char & bump lptr
  210. */
  211. litchar() {
  212.   int i, oct;
  213.   if((ch!=92)|(nch==0)) return gch();
  214.   gch();
  215. /*if(ch=='n') {gch(); return 13;}    CR */
  216.   if(ch=='n') {gch(); return 10;} /* LF for UNIX */
  217.   if(ch=='t') {gch(); return  9;} /* HT */
  218.   if(ch=='b') {gch(); return  8;} /* BS */
  219.   if(ch=='f') {gch(); return 12;} /* FF */
  220.   i=3; oct=0;
  221.   while(((i--)>0)&(ch>='0')&(ch<='7')) oct=(oct<<3)+gch()-'0';
  222.   if(i==2) return gch(); else return oct;
  223.   }
  224.  
  225.